package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
)

/*
===生产者消费者模型之异步有缓冲模型===
  - 使用缓冲通道，生产者占用切片时，不停向通道添加数至通道满，然后供消费者读取
  - 生产和消费是异步的
*/
func main() {
	ch := make(chan int, 5)
	go producer(ch)
	consumer(ch)

	sig := make(chan os.Signal, 1)
	signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
	fmt.Printf("quit (%v)\n", <-sig)
}

func producer(ch chan<- int) {
	for i := 0; i < 10; i++ {
		ch <- i * i
		//打印属于 IO 操作，当前 goroutine 会让出控制权，其他goroutine 得以执行，类似与sleep
		fmt.Println("生产：", i*i)
	}
	//发送完数据，发送方关闭 channel
	close(ch)
}
func consumer(ch <-chan int) {
	for num := range ch {
		fmt.Println("消费：", num)
	}
}
